home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_03
/
9n03042a
< prev
next >
Wrap
Text File
|
1991-01-27
|
2KB
|
81 lines
/***************************************************
* NAME : insert_one
*
* DESCRIPTION: insert a item into the item queue.
* This queue works as a circular buffer with two
* pointers, insert and delete. As a character is
* inserted the insert pointer is incremented
* modulo que length. In other words after each
* increment the pointer is checked to see if it
* equals the length of the que. If so, then it
* is reset to zero. When the pointers are equal
* then the que is full. The insert pointer is always
* incremented first then the item is inserted.
* The empty flag is always set false if a item
* is inserted.
******************************************************/
#include "que.h"
insert_one(item, k_que)
unsigned char item;
struct g_queue *k_que;
{
unsigned int insert,remove;
while (((k_que->insert)+1==k_que->remove) ||
((k_que->insert)-(k_que->remove)==kqlength-1))
suspend(); /* queue is full */
set_irq();
insert = k_que->insert;
remove = k_que->remove;
(*k_que).que[insert] = item;
if (++insert == kqlength)
insert = 0;
k_que->insert = insert;
k_que->empty = false;
clear_irq();
}
/************************************************
* NAME : remove_one
*
* DESCRIPTION: remove a item from the item queue.
* This queue works as a circular buffer with two
* pointers insert, and delete. as a character is
* removed the remove pointer is incremented modulo
* que length. In other words after each increment
* the pointer is checked to see if it equals the
* length of the que. If so, then it is reset
* to zero. When the pointers are equal then the
* que is empty. And the que empty flag is set
* true. The remove pointer is always pointing to
* the next character to be removed. When the
* remove pointer is equal to the insert pointer
* - 1 then the queue is full
*
****************************************************/
remove_one(k_que)
struct g_queue *k_que;
{
unsigned int insert,remove;
unsigned char item;
while (k_que->empty == true)
suspend();
set_irq();
insert = k_que->insert;
remove = k_que->remove;
item = k_que->que[remove];
if (++remove == kqlength)
remove = 0;
if ( remove == insert )
k_que->empty = true;
k_que->remove = remove;
clear_irq();
return item;
}